package com.example.demo.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class UploadServiceImpl implements UploadService {

    @Value("${file.static-path}")
    public String staticPath;

    @Value("${file.local-path}")
    public String localPath;

    /**
     * MultipartFile 这个对象是  SpringMVC提供的文件上传的可接受的类
     * 他的底层自动会和HttpServletRequest request中的request.getInputStream()融合
     * 从而达到文件上传的效果
     *
     * @author chenlirun
     * @date 2021/11/20 10:14
     */
    @Override
    public Map<String, List<String>> upload(List<MultipartFile> multipartFiles, String dir) {

        Map<String, List<String>> map = new HashMap<>();
        List<String> strings = new ArrayList<>();
        try {
            for (MultipartFile multipartFile : multipartFiles) {
                //            获取本地上传文件的文件真实名称
                String realFileName = multipartFile.getOriginalFilename();
//            截取文件名的后缀
                String imgSuffix = realFileName.substring(realFileName.lastIndexOf("."));
//            生成唯一的文件名称
                String newFileName = UUID.randomUUID() + imgSuffix;

//            日期目录
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                String datePath = dateFormat.format(new Date());
                File targetFile = new File(localPath + dir, datePath);
                if (!targetFile.exists()) targetFile.mkdirs();
//            指定文件上传以后的文件目录
                File fileName = new File(targetFile, newFileName);
//            指定文件上传的路径
                multipartFile.transferTo(fileName);
                String accessName = staticPath + "/uploads" + "/" + dir + "/" + datePath + "/" + newFileName;
                strings.add(accessName);
            }
            map.put("image",strings);
            return map;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}
